<?php
/**
 * 尚善福· 购物车管理模块的逻辑处理
 * ============================================================================
 * 版权所有 2017-2020 北京优特世纪科技有限公司，并保留所有权利。
 * 网站地址: http://www.unitewww.com;
 * ============================================================================
 * 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用；
 * 不允许对程序代码以任何形式任何目的的再发布。
 * ============================================================================
 * @since: 1.0
 * @version: 1.0
 **/
namespace Home\Model;
use Think\Model;
class CartModel extends Model{
	/**
	 +--------------------------------------------------------------------------
	 * 实现获取用户购物车列表的功能
	 * @param type $uid   用户ID
     * @param type $checked  是否被用户勾选中的 0为全部 1为选中  一般没有查询不选中的商品情况
     * $mode 0  返回数组形式  1 直接返回result
	 * @author : XC跃
	 * @date : 2018-10-19
	 +--------------------------------------------------------------------------
	 */
    public function cartList($uid,$gid,$checked = 0,$mode =0,$addre){
		//实例化相关表
		$cident = M('cart');
		if(''!=$gid){
		    $cdata['ca_check'] = '0';
		    $where = "`ca_uid`='".$uid."' and `ca_gid`!='".$gid."' and `ca_check`=1";
		    $cident->where($where)->save($cdata);
		}
		$conf = '0'==$checked?"1":"`ca_check`=1";

		//获取购物车商品
		$anum = $sum_fee = $fen_fee = $yun_fee = 0;
		$cList = $cident->where("`ca_uid`='".$uid."' and $conf")->order("ca_atime desc")->select();
		//dump($cList);
		foreach($cList as $key=>$val){			
		    $cList[$key]['price'] = round($val['ca_gnum']*$val['ca_gmoney'],2);
		    $cList[$key]['score'] = round($val['ca_gnum']*$val['ca_jmoney'],2);
		    $cList[$key]['stock'] = getGoodNum($val['ca_gid']);// 最多可购买的库存数量
		    // 如果要求只计算购物车选中商品的价格和数量,并且当前商品没选择 则跳过
		    if($checked=='0' && $val['ca_check']=='0'){
		        continue;
		    }
		    $anum += $val['ca_gnum'];  //商品数量
		    
		    $sum_fee += round($val['ca_gnum']*$val['ca_gmoney'],2);  //实付金额
		    $fen_fee += round($val['ca_gnum']*$val['ca_jmoney'],2);  //实付积分
		}
		$yun_fee = freight($addre,$cList);
		$total_price = array('sum_fee'=>$sum_fee,'fen_fee'=>$fen_fee,'yun_fee'=>$yun_fee,'nums'=>$anum); // 总计
		if($mode==1){
			return array('cartList'=>$cList,'total_price'=>$total_price);
		}
	}
	/**
	 +--------------------------------------------------------------------------
	 * 实现添加购物车的功能
	 * @param type $uid  用户id
	 * @param type $gid  商品id
     * @param type $num  商品数量
     * @param type $color 商品规格
     * @param type $size  商品规格
     * @param type $chec 商品默认选中
	 * @author : XC跃
	 * @date : 2018-10-19
	 +--------------------------------------------------------------------------
	 */
	public function add_cart($uid,$gid,$num,$color,$size,$check){
		//实例化相关表
		$uident = M('user');
		$cident = M('cart');
		$gident = M('goods');
		//获取数据
		$goFind = $gident->where("`go_id`='".$gid."'")->find(); // 找出这个商品
		if(empty($goFind)){
		    return array('status'=>-2,'msg'=>'购买商品不存在');
		}
		//$usFind = $uident->where("`us_uid`='".$uid."'")->find();  // 获取会员信息
		if(!isset($uid)){
			return array('status'=>0,'url'=>U('Login/login'));
		}
		//查询购物车是否已经存在这商品
		$caFind = $cident->where("`ca_uid`='".$uid."' and `ca_gid`='".$gid."'")->find(); 
// 		if(!empty($goFind['go_color']) && empty($color)){ // 有商品规格 但是前台没有传递过来
//             return array('status'=>-2,'msg'=>'商品颜色未选择');   
// 		}if(!empty($goFind['go_size']) && empty($size)){   // 有商品规格 但是前台没有传递过来
//             return array('status'=>-2,'msg'=>'商品规格未选择');   
// 		}
		if($num <= 0){ 
            return array('status'=>-2,'msg'=>'购买商品数量不能为0');            
		}if(($goFind['go_stock'] < $num) || ($goFind['go_stock']<=$caFind['ca_gnum'])){
            return array('status'=>-2,'msg'=>'商品库存不足');
		}
		//规格参数处理
		$jia = (!empty($color) && !empty($size))?',':'';  //链接符号
		$spec = $color.$jia.$size; //规格汇总
		$where = "`ca_uid`='".$uid."' and `ca_gid`='".$gid."' and `ca_spec`='".$spec."'"; // 查询购物车是否已经存在这商品
		$cart_goods = $cident->where($where)->find(); // 查找购物车是否已经存在该商品
		$weight = $num*$goFind['go_weight'];
		$data = array(
			'ca_uid'    => $uid,   // 用户id
			'ca_type'	=> '1',   // 商品类型：1普通
			'ca_gid'    => $goFind['go_id'],     // 商品id
			'ca_gsn'    => $goFind['go_sn'],     // 商品SN
			'ca_gname'  => $goFind['go_name'],   // 商品名称
			'ca_gprice' => $goFind['go_market'], // 零售价
			'ca_gmoney' => $goFind['go_price'],  // 批发价
			'ca_cmoney' => $goFind['go_amount'], // 成本价
			'ca_xmoney' => $goFind['go_price'],  // 使用现金
			'ca_jmoney' =>$goFind['go_score'],  // 使用积分
			'ca_weight' => $weight,   // 商品重量
			'ca_free'   => $goFind['go_free'],   // 商品运费
			'ca_gnum'   => $num,    // 购买数量
			'ca_spec'   => $spec,   // 规格参数
			'ca_check'  => $check,  // 购物车默认选中
				'ca_atime'  => time(),  // 加入购物车时间
		);
        // 如果商品购物车已经存在
        if($cart_goods){
            // 如果购物车的已有数量加上 这次要购买的数量  大于  库存数  则不再增加数量
            if(($cart_goods['ca_gnum'] + $num) > $goFind['go_stock']){
                $num = 0;
            }
            $result = $cident->where("`ca_id` ='".$cart_goods['ca_id']."'")->save(array("ca_gnum"=>($cart_goods['ca_gnum']+$num))); // 数量相加
        }else{
            $insert_id = $cident->add($data);
       	}
       	return array('status'=>1,'msg'=>'购物车添加成功'); 
	}
	/**
	 +--------------------------------------------------------------------------
	 * 实现查看购物车的商品数量
	 * @param $uid 会员id
	 * @param $mode 0  返回数组形式  1 直接返回result
	 * @author : XC跃
	 * @date : 2018-06-05
	 +--------------------------------------------------------------------------
	 */
	public function cart_count($uid,$mode=0){
	    //实例化相关表
	    $cident = M('cart');
	    $count = $cident->where("`ca_uid`='".$uid."' and `ca_check`=1")->count();
	    if($mode=='1'){
	        return  $count;
	    }else{
	        return array('status'=>-1,'msg'=>'你的购物车没有选中商品','url'=>U('Cart/cart'));
	    }
	}
	/**
	 +--------------------------------------------------------------------------
	 * 实现会员添加一个新订单的功能
	 * @param type $uid  用户id
	 * @param type $add_id   地址id
	 * * @param type $cu_id   优惠券id
	 * @return type $order_id 返回新增的订单id
	 * @author : XC跃
	 * @date : 2018-06-06
	 +--------------------------------------------------------------------------
	 */
	public function addOrder($uid,$add_id,$car_price){
	    //实例化相关表
	    $uident = M('user');
	    $cident = M('cart');
	    $oident = M('order');
	    $dident = M('order_details');
	    // 仿制灌水 1天只能下 30 单  // select * from `tp_order` where user_id = 1  and order_sn like '20151217%'
	    $order_count =$oident->where("`or_uid`='".$uid."' and `or_batch` like '".date('Ymd')."%'")->count(); // 查找购物车商品总数量
	    if($order_count >= 30){
	        return array('status'=>-1,'msg'=>'一天只能下30个订单');
	    }
	    //1、执行添加订单
	    $odata['or_batch'] = $batch = Date('YmdHis').rand(10000,99999); // 订单编号
	    $odata['or_uid']   = $uid; // 用户id
			$odata['or_type']   = '1';// 普通商品
	    $odata['or_ostate']= '1';  // 订单状态
	    $odata['or_wstate']= '1';  // 物流状态
	    $odata['or_pstate']= '1';  // 支付状态
	    $odata['or_add']   = addreSerialize($add_id,'1'); // 收货地址
	    $odata['or_gprice']= $car_price['total_amount']; // 商品总价
	    $odata['or_xmon']  = $xmon = $car_price['umoney']; // 使用现金
	    $odata['or_jmon']  = $jmon = $car_price['energy']; // 使用积分
	    $odata['or_fmon']  = $car_price['ship_price']; // 运费
	    $odata['or_zmon']  = $smon = $car_price['order_amount']; // 应付金额
	    $odata['or_xtime'] = time();  // 下单时间
	    $odata['or_note']  = trim(I('post.message')); // 用户留言
	    $order_id = $oident->add($odata);
	    if($order_id){
	        logOrder($order_id,'2','您提交了商城订单','提交订单');   //记录订单操作日志
	        //2、执行添加订单详情
	        foreach($car_price['cart_goods'] as $key=>$cval){
	            $ddata['de_type']  = $cval['ca_type']; // 商品类型
	            $ddata['de_uid']   = $uid;       // 会员ID
	            $ddata['de_oid']   = $order_id;  // 订单id
	            $ddata['de_gid']   = $cval['ca_gid'];    // 商品id
	            $ddata['de_gname'] = $cval['ca_gname'];  // 商品名称
	            $ddata['de_gnum']  = $cval['ca_gnum'];   // 购买数量
	            $ddata['de_gprice']= $cval['ca_gprice']; // 市场价
	            $ddata['de_gmoney']= $cval['ca_gmoney']; // 本店价
	            $ddata['de_cmoney']= $cval['ca_cmoney']; // 成本价
	            $ddata['de_xmoney']= $cval['ca_xmoney']; // 使用现金
	            $ddata['de_jmoney']= $cval['ca_jmoney']; // 使用积分
	            $ddata['de_ymoney']= $car_price['ship_price'];   // 运费
	            $ddata['de_zhe']   = $cval['ca_zhe'];    // 会员折扣
	            $ddata['de_spec']  = $cval['ca_spec'];   // 规格
	            $ddata['de_cid']   = '0'; // 是否评价
	            $ddata['de_state'] = '1'; // 详情状态
	            $deta_oid = $dident->add($ddata);
	        }
	    }
	    //5、删除已提交订单商品
	    $cident->where("`ca_uid`='".$uid."' and `ca_check`=1")->delete();
	    return array('status'=>1,'msg'=>'提交订单成功','result'=>$order_id,'mon'=>$smon); // 返回新增的订单id
	}
	/**
	 +--------------------------------------------------------------------------
	 * 实现订单中，对会员使用余额进行比例分配
	 * $omon 订单表应付金额
	 * $cmon 订单合并表付款金额
	 * $umon 会员使用余额
	 * @author : XC跃
	 * @date : 2017-07-19
	 * 公式：订单表应付金额/订单合并表订单金额*使用余额
	 +--------------------------------------------------------------------------
	 */
	public function get_order_money($omon,$cmon,$umon){
	    if($umon!='0'){
	        $mon1 = round($omon/$cmon/100,4);
	        $mon2 = round($mon1*$umon*100,2);
	    }else{
	        $mon2 = '0';
	    }
	    return $mon2;
	}
	/**
	+--------------------------------------------------------------------------
	 * 实现添加收藏的功能
	 * @param type $id  ID
	 * @param type $type 1商品 2 店铺
	 * @author : wjl
	 * @date : 2017-07-28
	+--------------------------------------------------------------------------
	 */
	public function add_Coll($uid,$id,$type){
		//实例化相关表
		$gident = M('goods');
		$sident = M('shop');
		$cident = M('goods_collect');
		if($type==1){
			$gcount=$gident->where("go_id=".$id." and go_sale=1")->count();
			if($gcount==0){
				exit(json_encode(array('status'=>-2,'msg'=>'该商品暂时不可收藏哦')));
			}
		}
		if($type==2){
			$scount=$sident->where("sh_id=".$id." and sh_sstate=1")->count();
			if($scount==0){
				exit(json_encode(array('status'=>-2,'msg'=>'该店铺暂时不可收藏哦')));
			}
		}
		$count=$cident->where("gc_uid=".$uid." and gc_gid=".$id." and gc_type=".$type."")->count();
		if($count>0){
			exit(json_encode(array('status'=>-2,'msg'=>'您已收藏过了')));
		}
		$data['gc_uid']   = $uid;
		$data['gc_gid']   = $id;
		$data['gc_atime'] = time();
		$data['gc_type']  = $type;
		$cident->data($data)->add();
		return array('status'=>1,'msg'=>'收藏成功');
	}
}